home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-10-23 | 20.7 KB | 878 lines | [TEXT/MSET] |
- \ PowerPC 601 disassembler
- \ Copyright 1993-1994 Xan Gregg All Rights Reserved
- \ Permission is granted for internal distribution by Creative Solutions, Inc.
-
- \ Permission also granted for Mops distribution. Mops mods made by
- \ Mike Hore.
-
-
- DECIMAL
-
- : dbgr postpone db ; immediate \ db has a different meaning here!
-
- 0 value curAddr
- 0 value curInstr
- 0 value range_start
- 0 value range_end
-
- 0 value hiAddr \ highest address branched to
-
- create instrText 256 allot
- create hex.text 256 allot
-
-
- \ NAME? and .NAME will probably end up in the main dictionary in the
- \ native PPC version.
-
- : NAME? { xt \ addr len -- addr len true | -- false }
- xt 2-
- -1 traverse
- n>count -> len -> addr
- addr len + 3 + $ fffffffc and
- xt 2- =
- IF addr len true
- ELSE false
- THEN
- ;
-
- : .NAME { xt -- }
- xt range_start u>= xt range_end u<= and 0EXIT
- xt name? IF type ELSE ." (no name)" THEN
- ;
-
- : append.text ( addr ) { cnt target -- }
- target c@ 1+ target + cnt cmove
- target c@ cnt + target c! ;
-
- : put.ch ( char -- | put char into next instrText position )
- instrText c@ 1+ dup instrText c! ( update counter )
- instrText + c! ; ( store the character )
-
- : put$ ( addr len -- | put string into next text position )
- ( count ) instrText append.text ;
-
- : trimOff ( n -- )
- instrText c@ swap - instrText c! ;
-
- : put> ( put next character into instrText )
- postpone [char]
- postpone put.ch ; immediate
-
- : put.unsigned.hex ( n\digits -- | writes unsigned n into instrText )
- base >r hex
- swap 0 <# #s #> rot min instrText append.text
- r> -> base ;
-
- : ?negate(bits) { n bits \ flag shftcnt -- flag }
- 32 bits - -> shftcnt
- 0 -> flag
- n shftcnt scale
- dup 0<
- if negate
- true -> flag
- then
- shftcnt negate scale
- flag ;
-
- : ?negate { n digits -- abs digits flag } \ true if "negative"
- n digits 4* ?negate(bits)
- digits swap ;
-
- : put.signed.hex ( n\digits -- | writes signed n into instrText )
- ?negate if put> - then
- put.unsigned.hex ;
-
- : putUByte put> $ 2 put.unsigned.hex ;
- : putSWord put> $ 4 put.signed.hex ;
- : putUWord put> $ 4 put.unsigned.hex ;
- : putSLong put> $ 8 put.signed.hex ;
- : putULong put> $ 8 put.unsigned.hex ;
-
- 0 value lastAddr
-
- : putAddr dup -> lastAddr putULong ;
-
- : putDec# ( n -- )
- base >R
- decimal
- dup abs 0 <# #s rot sign #>
- instrText append.text
- R> -> base ;
-
- : putBin# ( n\bits -- )
- put> b
- base >R
- >R 2 -> base
- 0 <# R> 0 do # loop #>
- instrText append.text
- R> -> base ;
-
- : putSPR ( n -- )
- case
- 0 of " MQ" put$ endof
- 1 of " XER" put$ endof
- 4 of " RTCU" put$ endof
- 5 of " RTCL" put$ endof
- 6 of " DEC" put$ endof
- 8 of " LR" put$ endof
- 9 of " CTR" put$ endof
- ( else) " spr" put$ dup putDec#
- endcase ;
-
- : tab ( -- )
- instrText count + 10 blanks
- 10 instrText c! ;
-
- \ -----------------------------------------------------------------
-
-
- create name$ 16 allot
-
- : D> { \ addr cnt -- } \ Usage: d> dINSTR <whatever>
- \ Compiles: : dINSTR " INSTR" put$ <whatever>
- temp{ string+ s }
-
- " : " put: s
- bl word count -> cnt -> addr
- addr cnt add: s bl +: s & " +: s bl +: s
- addr 1+ cnt 1- add: s & " +: s " put$ " add: s
- all: s evaluate ;
-
-
- : extract ( a\b -- n )
- curInstr over 31 - scale
- >r swap - 1+ 1 swap scale 1- r> and ;
-
-
- \ ?EXCEPTION handles the special register names. We'll need to change
- \ the MacForth ones to whatever Mops will use! - But as of Mops 2.5 this
- \ hasn't been finalized yet.
-
- : ?exception ( n -- n\false or true )
- SELECT[ 1 ]=> " r1/sys_SP"
- [ 2 ]=> " r2/TOC"
- [ 13 ]=> " r13/mainData"
- [ 14 ]=> " r14/modData"
- [ 15 ]=> " r15/mainCode"
- [ 16 ]=> " r16/modCode"
- [ 17 ]=> " r17/RP"
- [ 18 ]=> " r18/SP"
- [ 19 ]=> " r19/FSP"
- [ 20 ]=> " r20/obj_base"
- [ 21 ]=> " r21/I"
- DEFAULT=> false EXIT
- ]SELECT
- put$ true ;
-
- : putCond ( n -- )
- case
- 0 of " ge" endof
- 1 of " le" endof
- 2 of " ne" endof
- 3 of " ns" endof
- 4 of " lt" endof
- 5 of " gt" endof
- 6 of " eq" endof
- 7 of " so" endof
- endcase put$ ;
-
- : cond { \ bi bo -- }
- 6 10 extract -> bo
- 11 15 extract 3 and -> bi
- bo 4 and 0= if
- put> d
- bo 2 and not if put> n then put> z
- then
- bo 16 and 0= if
- bo 8 and -1 scale bi or putCond
- then ;
-
- : li
- 6 29 extract 2 scale
- dup hex# 02000000 >= if hex# fc000000 or then \ sign extend
- curInstr 2 and 0= if curAddr 4- + then
- curInstr 1 and 0= if dup hiAddr max -> hiAddr then
- putAddr ;
-
- : bd
- 16 29 extract 2 scale
- extend \ sign extend
- curInstr 2 and 0= if curAddr 4- + then
- curInstr 1 and 0= if dup hiAddr max -> hiAddr then
- putAddr ;
-
-
-
- : rReg ?exception not if put> r putDec# then ;
- : frReg " fr" put$ putDec# ;
- : crbReg " cr" put$ 4 /mod putDec# put> _
- case
- 0 of " LT" endof
- 1 of " GT" endof
- 2 of " EQ" endof
- 3 of " SO" endof
- endcase put$ ;
- : crfReg " cr" put$ putDec# ;
- : comma " , " put$ ;
- : rD 6 10 extract rReg ;
- : rS 6 10 extract rReg ;
- : rA 11 15 extract rReg ;
- : rB 16 20 extract rReg ;
- : rA, rA comma ;
- : rA0, 11 15 extract if rA, else " 0, " put$ then ;
- : rB, rB comma ;
- : rS, rS comma ;
- : rD, rD comma ;
- : (rA) put> ( rA put> ) ;
- : simm curInstr Lo2 extend putDec# ;
- : uimm curInstr Lo2 putUWord ;
- : ?RC curInstr 1 and if put> . then ;
- : crbD 6 10 extract crbReg ;
- : crbA, 11 15 extract crbReg comma ;
- : crbB 16 20 extract crbReg ;
- : crbD, crbD comma ;
- : crfD 6 8 extract crfReg ;
- : crfS 11 13 extract crfReg ;
- : crfD, crfD comma ;
- : crfD0, 6 8 extract if crfD comma then ;
- : frD 6 10 extract frReg ;
- : frS 6 10 extract frReg ;
- : frA, 11 15 extract frReg comma ;
- : frB 16 20 extract frReg ;
- : frC 21 25 extract frReg ;
- : frB, frB comma ;
- : frC, frC comma ;
- : frD, frD comma ;
- : frS, frS comma ;
- : ?LK curInstr 1 and if put> l then ;
- : ?AA curInstr 2 and if put> a then ;
- : MB 21 25 extract putDec# ;
- : ME 26 30 extract putDec# ;
- : NB 16 20 extract putDec# ;
- : SH 16 20 extract putDec# ;
- : SH, SH comma ;
- : MB, MB comma ;
- : ME, ME comma ;
- : SPR 16 20 extract 5 scale 11 15 extract or putSPR ;
- : SPR, SPR comma ;
- : ?condReg 11 13 extract ?dup if crfReg then ;
- : ?predict 10 10 extract if put> - then ;
- : disp curInstr Lo2 extend putSWord ;
- : ?disp curInstr Lo2 if disp then ;
- : SR 12 15 extract " sr" put$ putDec# ;
- : SR, SR comma ;
- : TO, 6 10 extract " TO:" put$ 5 putBin# comma ;
- : CRM, 12 19 extract " CRM:" put$ 8 putBin# comma ;
- : FM, 7 14 extract " FM:" put$ 8 putBin# comma ;
- : IMM 16 19 extract 4 putBin# ;
-
- : rArB tab rA, rB ;
- : rA0rB tab rA0, rB ;
- : rSrArB tab rS, rA, rB ;
- : rDrArB tab rD, rA, rB ;
- : rSrA0rB tab rS, rA0, rB ;
- : rDrA0rB tab rD, rA0, rB ;
- : RCrSrArB ?RC rSrArB ;
- : RCrDrArB ?rc rDrArB ;
- : rDrASIMM tab rD, rA, simm ;
- : rDrA0SIMM tab rD, rA0, simm ;
- : RCrDrA ?rc tab rD, rA ;
- : RCrArS ?rc tab rA, rS ;
- : rArSUIMM tab rA, rS, uimm ;
- : RCrArSrB ?rc tab rA, rS, rB ;
- : crbDcrbAcrbB tab crbD, crbA, crbB ;
- : RCfrDfrB ?RC tab frD, frB ;
- : RCfrDfrAfrB ?RC tab frD, frA, frB ;
- : RCfrDfrAfrC ?RC tab frD, frA, frC ;
- : RCfrDfrAfrCfrB ?RC tab frD, frA, frC, frB ;
- : disp(rA0) 11 15 extract 0= if disp else ?disp (rA) then ;
- : rDdisp(rA0) tab rD, disp(rA0) ;
- : frDdisp(rA0) tab frD, disp(rA0) ;
- : frDrA0rB tab frD, rA0, rB ;
- : rSdisp(rA0) tab rS, disp(rA0) ;
- : frSdisp(rA0) tab frS, disp(rA0) ;
- : frSrA0rB tab frS, rA0, rB ;
- : ?bCR tab 11 13 extract ?dup if crfReg then ;
- : ?bCR, 11 13 extract ?dup if crfReg comma then ;
-
-
- d> Dadd RCrDrArB ;
- d> Daddo RCrDrArB ;
- d> Daddc RCrDrArB ;
- d> Daddco RCrDrArB ;
- d> Dadde RCrDrArB ;
- d> Daddeo RCrDrArB ;
- d> Daddi rDrA0SIMM ;
- d> Daddic rDrASIMM ;
- d> Daddic. rDrASIMM ;
- d> Daddis rDrA0SIMM ;
- d> Daddme RCrDrA ;
- d> Daddmeo RCrDrA ;
- d> Daddze RCrDrA ;
- d> Daddzeo RCrDrA ;
- d> Dand RCrArSrB ;
- d> Dandc RCrArSrB ;
- d> Dandi. rArSUIMM ;
- d> Dandis. rArSUIMM ;
- d> Db ( ?lk ) ?aa ?lk tab li ;
- d> Dbc 1 trimOff cond ( ?lk ) ?aa ?lk ?predict tab ?bCR, bd ;
- d> Dbcctr 4 trimOff cond ( ?lk ) " ctr" put$ ?lk ?predict ?bCR ;
- d> Dbclr 3 trimOff cond ( ?lk ) " lr" put$ ?lk ?predict ?bCR ;
- d> Dcmp tab crfD0, rA, rB ;
- d> Dcmpi tab crfD0, rA, SIMM ;
- d> Dcmpl tab crfD0, rA, rB ;
- d> Dcmpli tab crfD0, rA, SIMM ;
- d> Dcntlzw ?RC tab rA, rS ;
- d> Dcrand crbDcrbAcrbB ;
- d> Dcrandc crbDcrbAcrbB ;
- d> Dcreqv crbDcrbAcrbB ;
- d> Dcrnand crbDcrbAcrbB ;
- d> Dcrnor crbDcrbAcrbB ;
- d> Dcror crbDcrbAcrbB ;
- d> Dcrorc crbDcrbAcrbB ;
- d> Dcrxor crbDcrbAcrbB ;
- d> Ddcbf rA0rB ;
- d> Ddcbi rA0rB ;
- d> Ddcbst rA0rB ;
- d> Ddcbt rA0rB ;
- d> Ddcbtst rA0rB ;
- d> Ddcbz rA0rB ;
- d> Ddivw RCrDrArB ;
- d> Ddivwo RCrDrArB ;
- d> Ddivwu RCrDrArB ;
- d> Ddivwuo RCrDrArB ;
- d> Deciwx rDrA0rB ;
- d> Decowx rSrA0rB ;
- d> Deieio ;
- d> Deqv RCrSrArB ;
- d> Dextsb RCrArS ;
- d> Dextsh RCrArS ;
- d> Dfabs RCfrDfrB ;
- d> Dfadd RCfrDfrAfrB ;
- d> Dfadds RCfrDfrAfrB ;
- d> Dfcmpo tab crfD, frA, frB ;
- d> Dfcmpu tab crfD, frA, frB ;
- d> Dfctiw RCfrDfrB ;
- d> Dfctiwz RCfrDfrB ;
- d> Dfdiv RCfrDfrAfrB ;
- d> Dfdivs RCfrDfrAfrB ;
- d> Dfmadd RCfrDfrAfrCfrB ;
- d> Dfmadds RCfrDfrAfrCfrB ;
- d> Dfmr RCfrDfrB ;
- d> Dfmsub RCfrDfrAfrCfrB ;
- d> Dfmsubs RCfrDfrAfrCfrB ;
- d> Dfmul RCfrDfrAfrC ;
- d> Dfmuls RCfrDfrAfrC ;
- d> Dfnabs RCfrDfrB ;
- d> Dfneg RCfrDfrB ;
- d> Dfnmadd RCfrDfrAfrCfrB ;
- d> Dfnmadds RCfrDfrAfrCfrB ;
- d> Dfnmsub RCfrDfrAfrCfrB ;
- d> Dfnmsubs RCfrDfrAfrCfrB ;
- d> Dfrsp RCfrDfrB ;
- d> Dfsub RCfrDfrAfrB ;
- d> Dfsubs RCfrDfrAfrB ;
- d> Dicbi rA0rB ;
- d> Disync ;
- d> Dlbz rDdisp(rA0) ;
- d> Dlbzu rDdisp(rA0) ;
- d> Dlbzux rDrA0rB ;
- d> Dlbzx rDrA0rB ;
- d> Dlfd frDdisp(rA0) ;
- d> Dlfdu frDdisp(rA0) ;
- d> Dlfdux frDrA0rB ;
- d> Dlfdx frDrA0rB ;
- d> Dlfs frDdisp(rA0) ;
- d> Dlfsu frDdisp(rA0) ;
- d> Dlfsux frDrA0rB ;
- d> Dlfsx frDrA0rB ;
- d> Dlha rDdisp(rA0) ;
- d> Dlhau rDdisp(rA0) ;
- d> Dlhaux rDrA0rB ;
- d> Dlhax rDrA0rB ;
- d> Dlhbrx rDrA0rB ;
- d> Dlhz rDdisp(rA0) ;
- d> Dlhzu rDdisp(rA0) ;
- d> Dlhzux rDrA0rB ;
- d> Dlhzx rDrA0rB ;
- d> Dlmw rDdisp(rA0) ;
- d> Dlswi tab rD, rA0, NB ;
- d> Dlswx rDrA0rB ;
- d> Dlwarx rDrA0rB ;
- d> Dlwbrx rDrA0rB ;
- d> Dlwz rDdisp(rA0) ;
- d> Dlwzu rDdisp(rA0) ;
- d> Dlwzux rDrA0rB ;
- d> Dlwzx rDrA0rB ;
- d> Dmcrf tab crfD, crfS ;
- d> Dmcrfs tab crfD, crfS ;
- d> Dmcrxr tab crfD ;
- d> Dmfcr tab rD ;
- d> Dmffs ?rc tab frD ;
- d> Dmfmsr tab rD ;
- d> Dmfspr tab rD, SPR ;
- d> Dmfsr tab rD, SR ;
- d> Dmfsrin tab rD, rB ;
- d> Dmtcrf tab CRM, rS ;
- d> Dmtfsb0 ?rc tab crbD ;
- d> Dmtfsb1 ?rc tab crbD ;
- d> Dmtfsf ?rc tab FM, frB ;
- d> Dmtfsfi ?rc tab crfD, IMM ;
- d> Dmtmsr tab rS ;
- d> Dmtspr tab SPR, rS ;
- d> Dmtsr tab SR, rS ;
- d> Dmtsrin tab rS, rB ;
- d> Dmulhw RCrDrArB ;
- d> Dmulhwu RCrDrArB ;
- d> Dmullw RCrDrArB ;
- d> Dmullwo RCrDrArB ;
- d> Dmulli rDrASIMM ;
- d> Dnand RCrArSrB ;
- d> Dneg RCrDrA ;
- d> Dnego RCrDrA ;
- d> Dnor RCrArSrB ;
- d> Dor RCrArSrB ;
- d> Dorc RCrArSrB ;
- d> Dori rArSUIMM ;
- d> Doris rArSUIMM ;
- d> Drfi ;
- d> Drlwimi ?rc tab rA, rS, SH, MB, ME ;
- d> Drlwinm ?rc tab rA, rS, SH, MB, ME ;
- d> Drlwnm ?rc tab rA, rS, rB, MB, ME ;
- d> Dsc ;
- d> Dslw RCrArSrB ;
- d> Dsraw RCrArSrB ;
- d> Dsrawi ?rc tab rA, Rs, SH ;
- d> Dsrw RCrArSrB ;
- d> Dstb rSdisp(rA0) ;
- d> Dstbu rSdisp(rA0) ;
- d> Dstbux rSrA0rB ;
- d> Dstbx rSrA0rB ;
- d> Dstfd frSdisp(rA0) ;
- d> Dstfdu frSdisp(rA0) ;
- d> Dstfdux frSrA0rB ;
- d> Dstfdx frSrA0rB ;
- d> Dstfs frSdisp(rA0) ;
- d> Dstfsu frSdisp(rA0) ;
- d> Dstfsux frSrA0rB ;
- d> Dstfsx frSrA0rB ;
- d> Dsth rSdisp(rA0) ;
- d> Dsthbrx rSrA0rB ;
- d> Dsthu rSdisp(rA0) ;
- d> Dsthux rSrA0rB ;
- d> Dsthx rSrA0rB ;
- d> Dstmw rSdisp(rA0) ;
- d> Dstswi tab rS, rA0, NB ;
- d> Dstswx rSrA0rB ;
- d> Dstw rSdisp(rA0) ;
- d> Dstwbrx rSrA0rB ;
- d> Dstwcx. rSrA0rB ;
- d> Dstwu rSdisp(rA0) ;
- d> Dstwux rSrA0rB ;
- d> Dstwx rSrA0rB ;
- d> Dsubf RCrDrArB ;
- d> Dsubfo RCrDrArB ;
- d> Dsubfc RCrDrArB ;
- d> Dsubfco RCrDrArB ;
- d> Dsubfe RCrDrArB ;
- d> Dsubfeo RCrDrArB ;
- d> Dsubfic rDrASIMM ;
- d> Dsubfme RCrDrA ;
- d> Dsubfmeo RCrDrA ;
- d> Dsubfze RCrDrA ;
- d> Dsubfzeo RCrDrA ;
- d> Dsync ;
- d> Dtlbie tab rB ;
- d> Dtw tab TO, rA, rB ;
- d> Dtwi tab TO, rA, simm ;
- d> Dxor RCrArSrB ;
- d> Dxori rArSUIMM ;
- d> Dxoris rArSUIMM ;
-
-
- create decode19List
- 0 , ' Dmcrf reloc,
- 16 , ' Dbclr reloc,
- 33 , ' Dcrnor reloc,
- 50 , ' Drfi reloc,
- 129 , ' Dcrandc reloc,
- 150 , ' Disync reloc,
- 193 , ' Dcrxor reloc,
- 225 , ' Dcrnand reloc,
- 257 , ' Dcrand reloc,
- 289 , ' Dcreqv reloc,
- 417 , ' Dcrorc reloc,
- 449 , ' Dcror reloc,
- 528 , ' Dbcctr reloc,
- 99999 , 0 , ( ### was token, )
-
- create decode31List
- 0 , ' Dcmp reloc,
- 4 , ' Dtw reloc,
- 8 , ' Dsubfc reloc,
- 10 , ' Daddc reloc,
- 11 , ' Dmulhwu reloc,
- 19 , ' Dmfcr reloc,
- 20 , ' Dlwarx reloc,
- 23 , ' Dlwzx reloc,
- 24 , ' Dslw reloc,
- 26 , ' Dcntlzw reloc,
- 28 , ' Dand reloc,
- 32 , ' Dcmpl reloc,
- 40 , ' Dsubf reloc,
- 54 , ' Ddcbst reloc,
- 55 , ' Dlwzux reloc,
- 60 , ' Dandc reloc,
- 75 , ' Dmulhw reloc,
- 83 , ' Dmfmsr reloc,
- 86 , ' Ddcbf reloc,
- 87 , ' Dlbzx reloc,
- 104 , ' Dneg reloc,
- \ 115 , ' Dmfpmr reloc,
- 119 , ' Dlbzux reloc,
- 124 , ' Dnor reloc,
- 136 , ' Dsubfe reloc,
- 138 , ' Dadde reloc,
- 144 , ' Dmtcrf reloc,
- 146 , ' Dmtmsr reloc,
- 150 , ' Dstwcx. reloc,
- 151 , ' Dstwx reloc,
- \ 178 , ' Dmtpmr reloc,
- 183 , ' Dstwux reloc,
- 200 , ' Dsubfze reloc,
- 202 , ' Daddze reloc,
- 210 , ' Dmtsr reloc,
- 215 , ' Dstbx reloc,
- 232 , ' Dsubfme reloc,
- 234 , ' Daddme reloc,
- 235 , ' Dmullw reloc,
- 242 , ' Dmtsrin reloc,
- 246 , ' Ddcbtst reloc,
- 247 , ' Dstbux reloc,
- 266 , ' Dadd reloc,
- \ 275 , ' Dmftb reloc,
- 278 , ' Ddcbt reloc,
- 279 , ' Dlhzx reloc,
- 284 , ' Deqv reloc,
- 306 , ' Dtlbie reloc,
- \ 307 , ' Dmftbu reloc,
- 310 , ' Deciwx reloc,
- 311 , ' Dlhzux reloc,
- 316 , ' Dxor reloc,
- 339 , ' Dmfspr reloc,
- 343 , ' Dlhax reloc,
- 375 , ' Dlhaux reloc,
- \ 403 , ' Dmttb reloc,
- 407 , ' Dsthx reloc,
- 412 , ' Dorc reloc,
- \ 434 , ' Dslbia reloc,
- \ 435 , ' Dmttbu reloc,
- 438 , ' Decowx reloc,
- 439 , ' Dsthux reloc,
- 444 , ' Dor reloc,
- 459 , ' Ddivwu reloc,
- \ 466 , ' Dslbiex reloc,
- 467 , ' Dmtspr reloc,
- 470 , ' Ddcbi reloc,
- 476 , ' Dnand reloc,
- 491 , ' Ddivw reloc,
- \ 498 , ' Dslbia reloc,
- 520 , ' Dsubfco reloc,
- 522 , ' Daddco reloc,
- 512 , ' Dmcrxr reloc,
- 533 , ' Dlswx reloc,
- 534 , ' Dlwbrx reloc,
- 535 , ' Dlfsx reloc,
- 536 , ' Dsrw reloc,
- 552 , ' Dsubfo reloc,
- 567 , ' Dlfsux reloc,
- 572 , ' Daddco reloc,
- 595 , ' Dmfsr reloc,
- 597 , ' Dlswi reloc,
- 598 , ' Dsync reloc,
- 599 , ' Dlfdx reloc,
- 616 , ' Dnego reloc,
- 631 , ' Dlfdux reloc,
- 648 , ' Dsubfeo reloc,
- 650 , ' Daddeo reloc,
- 659 , ' Dmfsrin reloc,
- 661 , ' Dstswx reloc,
- 662 , ' Dstwbrx reloc,
- 663 , ' Dstfsx reloc,
- 695 , ' Dstfsux reloc,
- 711 , ' Dmtfsf reloc,
- 712 , ' Dsubfzeo reloc,
- 714 , ' Daddzeo reloc,
- 725 , ' Dstswi reloc,
- 727 , ' Dstfdx reloc,
- 744 , ' Dsubfmeo reloc,
- 746 , ' Daddmeo reloc,
- 747 , ' Dmullwo reloc,
- 759 , ' Dstfdux reloc,
- 778 , ' Daddo reloc,
- 790 , ' Dlhbrx reloc,
- 792 , ' Dsraw reloc,
- 824 , ' Dsrawi reloc,
- 854 , ' Deieio reloc,
- 918 , ' Dsthbrx reloc,
- 922 , ' Dextsh reloc,
- 954 , ' Dextsb reloc,
- 971 , ' Ddivwuo reloc,
- 982 , ' Dicbi reloc,
- \ 983 , ' Dstfiwx reloc,
- 1003 , ' Ddivwo reloc,
- 1014 , ' Ddcbz reloc,
- 99999 , 0 , ( ### was token, )
-
- create decode59List
- 18 , ' Dfdivs reloc,
- 20 , ' Dfsubs reloc,
- 21 , ' Dfadds reloc,
- \ 22 , ' Dfrsqrts reloc,
- \ 24 , ' Dfres reloc,
- -25 , ' Dfmuls reloc,
- -28 , ' Dfmsubs reloc,
- -29 , ' Dfmadds reloc,
- -30 , ' Dfnmsubs reloc,
- -31 , ' Dfnmadds reloc,
- 99999 , 0 , ( ### was token, )
-
- create decode63List
- 0 , ' Dfcmpu reloc,
- 12 , ' Dfrsp reloc,
- 14 , ' Dfctiw reloc,
- 15 , ' Dfctiwz reloc,
- 18 , ' Dfdiv reloc,
- 20 , ' Dfsub reloc,
- 21 , ' Dfadd reloc,
- \ 22 , ' Dfsqrt reloc,
- \ -23 , ' Dfsel reloc,
- -25 , ' Dfmul reloc,
- \ 26 , ' Dfsqrte reloc,
- -28 , ' Dfmsub reloc,
- -29 , ' Dfmadd reloc,
- -30 , ' Dfnmsub reloc,
- -31 , ' Dfnmadd reloc,
- 32 , ' Dfcmpo reloc,
- 38 , ' Dmtfsb1 reloc,
- 40 , ' Dfneg reloc,
- 64 , ' Dmcrfs reloc,
- 70 , ' Dmtfsb0 reloc,
- 72 , ' Dfmr reloc,
- 134 , ' Dmtfsfi reloc,
- 136 , ' Dfnabs reloc,
- 264 , ' Dfabs reloc,
- 583 , ' Dmffs reloc,
- 99999 , 0 , ( ### was token, )
-
- : invalid ( -- ) \ " INVALID INSTR: " put$ curInstr putULong
- ;
-
- : ListExecute ( list ) { addr \ opcode subopcode -- }
- 21 30 extract -> opcode
- 26 30 extract -> subopcode
- BEGIN
- addr @ dup 0< if negate subopcode else opcode then <>
- WHILE
- addr @ 99999 <>
- WHILE
- addr cell+ cell+ -> addr
- REPEAT
- THEN
- addr @ dup 0< if negate subopcode else opcode then =
- IF addr 4+ @abs execute
- ELSE invalid
- THEN ;
-
-
- : d19 ( -- ) decode19List listExecute ;
- : d31 ( -- ) decode31List listExecute ;
- : d59 ( -- ) decode59List listExecute ;
- : d63 ( -- ) decode63List listExecute ;
-
-
- (* Note: this isn't ANSI at all. I'll have to replace with difficulty!
-
- create decodeTable ]
- ( 0) invalid invalid invalid Dtwi invalid invalid invalid Dmulli
- ( 8) Dsubfic invalid Dcmpli Dcmpi Daddic Daddic. Daddi Daddis
- ( 16) Dbc Dsc Db D19 Drlwimi Drlwinm invalid Drlwnm
- ( 24) Dori Doris Dxori Dxoris Dandi. Dandis. invalid D31
- ( 32) Dlwz Dlwzu Dlbz Dlbzu Dstw Dstwu Dstb Dstbu
- ( 40) Dlhz Dlhzu Dlha Dlhau Dsth Dsthu Dlmw Dstmw
- ( 48) Dlfs Dlfsu Dlfd Dlfdu Dstfs Dstfsu Dstfd Dstfdu
- ( 56) invalid invalid invalid D59 invalid invalid invalid D63
- [
- **** *)
-
- create decodeTable
-
- ( 0) ' invalid reloc, ' invalid reloc,
- ' invalid reloc, ' Dtwi reloc,
- ' invalid reloc, ' invalid reloc,
- ' invalid reloc, ' Dmulli reloc,
- ( 8) ' Dsubfic reloc, ' invalid reloc,
- ' Dcmpli reloc, ' Dcmpi reloc,
- ' Daddic reloc, ' Daddic. reloc,
- ' Daddi reloc, ' Daddis reloc,
- ( 16) ' Dbc reloc, ' Dsc reloc,
- ' Db reloc, ' D19 reloc,
- ' Drlwimi reloc, ' Drlwinm reloc,
- ' invalid reloc, ' Drlwnm reloc,
- ( 24) ' Dori reloc, ' Doris reloc,
- ' Dxori reloc, ' Dxoris reloc,
- ' Dandi. reloc, ' Dandis. reloc,
- ' invalid reloc, ' D31 reloc,
- ( 32) ' Dlwz reloc, ' Dlwzu reloc,
- ' Dlbz reloc, ' Dlbzu reloc,
- ' Dstw reloc, ' Dstwu reloc,
- ' Dstb reloc, ' Dstbu reloc,
- ( 40) ' Dlhz reloc, ' Dlhzu reloc,
- ' Dlha reloc, ' Dlhau reloc,
- ' Dsth reloc, ' Dsthu reloc,
- ' Dlmw reloc, ' Dstmw reloc,
- ( 48) ' Dlfs reloc, ' Dlfsu reloc,
- ' Dlfd reloc, ' Dlfdu reloc,
- ' Dstfs reloc, ' Dstfsu reloc,
- ' Dstfd reloc, ' Dstfdu reloc,
- ( 56) ' invalid reloc, ' invalid reloc,
- ' invalid reloc, ' D59 reloc,
- ' invalid reloc, ' invalid reloc,
- ' invalid reloc, ' D63 reloc,
-
-
- : decode ( -- | disassembles instruction curInstr at address curAddr )
- 0 5 extract \ primary opcode
- 1cell * decodeTable + token@ execute ;
-
-
- : place.addr ( -- | put hex of addr into text )
- base >r hex
- curAddr 0 <# bl hold & : hold # # # # # # # # #>
- hex.text append.text
- r> -> base ;
-
- 16 constant instruction.column
-
- : col @xy drop ;
-
- : printInstrText
- instruction.column col - spaces
- instrText count type
- instrText 1+ 3 " bl " s=
- IF \ it's a bl - we'll print the name of the called word
- lastAddr 2- 3 spaces .name
- THEN
- ;
-
- : next.word ( -- word | get instruction, append to hex.text, bump address )
- curAddr @
- 4 +> curAddr
- dup
- base >r hex
- 0 <# bl hold # # # # # # # # #> hex.text append.text
- r> -> base ;
-
-
- : .colonHdr { instr \ #P #PL #rslts -- }
- \ types the info for a colon header
-
- curInstr -> instr
- cr cr hex.text count type
- ." : " curAddr 2- .name
- instr $ 8000 and
- IF ." leaf " ELSE ." non-leaf " THEN
- instr $ F and -> #PL
- instr 4 >> $ F and -> #P
- instr 8 >> $ F and -> #rslts
- ." #named parms: " #P .
- ." #locals: " #PL #P - .
- ." #results: " #rslts .
- ;
-
-
- : .extern { addr len instr -- }
- cr cr hex.text count type addr len type
- 2 spaces curAddr 2- .name
- instr $ FF and ." #parms: " .
- instr 8 >> $ FF and ." #results: " .
- ;
-
-
- : nextInstr { \ instr #P #PL #rslts -- }
- \ disassembles the next instruction
-
- instrText off
- hex.text off
- place.addr \ put in address of instruction
- next.word -> curInstr \ get the instruction itself
-
- curInstr -> instr
-
- \ now we check if this is a special case, and if so, we handle it
-
- instr 24 >> $ BE = IF instr .colonHdr EXIT THEN
- instr 16 >> $ BF00 = IF " extern" instr .extern EXIT THEN
- instr 16 >> $ BF01 = IF " sysCall" instr .extern EXIT THEN
-
- cr hex.text count type
- decode \ decode it
- printInstrText
- ;
-
-
- \ The exported words:
-
- : DISASM_RNG ( from \ to -- )
- \ ppcdisassembler
- swap -> curAddr
- begin
- nextInstr ?pause
- dup curAddr u<=
- until drop ;
-
- : DISASM_CNT ( from \ #instructions -- )
- \ ppcdisassembler
- swap -> curAddr 0 do
- nextInstr
- loop ;
-
- : DISASM_ONE ( addr -- addr' )
- \ ppcdisassembler
- -> curAddr nextInstr curAddr ;
-
- : ?ending-instr ( -- flag | is instr a return or jump? )
- \ ppcdisassembler
- 0 5 extract 19 =
- 21 31 extract dup 32 = swap 1056 = or and ;
-
- : ?past-hiaddr ( -- flag | is PC past highest addr branched to)
- \ ppcdisassembler
- curAddr hiAddr > ;
-
- : DISASM ( addr -- ) \ Exported. The basic disassembly word.
- \ ppcdisassembler
- -> curAddr
- 0 -> hiAddr
- BEGIN
- nextInstr ?pause
- ?ending-instr ?past-hiAddr and
- UNTIL ;
-
- : DISASM_WORD ( -- ) \ continues until paused
- ' \ get xt (cfa) of next word in input
- dup 3 and + \ align cfa to 4-byte boundary
- disasm ;
-
- : DISASM_XT ( xt -- ) \ continues until paused
- dup locate_src \ display source in QE
- disasm ; \ and disassemble from xt = cfa
-
- \ set_disasm_call_range sets up the address range within which we try
- \ to display the name of a called word. Since we mightn't be
- \ disassembling valid PPC code, we can't just assume an "address" is
- \ valid, or we might get sundry bus errors.
-
- : SET_DISASM_CALL_RANGE \ ( lo hi -- )
- -> range_end -> range_start ;
-